package com.itheima.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.itheima.constant.GetMoneyReport;
import com.itheima.constant.MessageConstant;
import com.itheima.constant.Report;
import com.itheima.entity.Result;
import com.itheima.service.MemberService;
import com.itheima.service.ReportService;
import com.itheima.service.SetmealService;
import com.itheima.utils.DateUtils;
import org.apache.poi.ss.formula.ptg.MemAreaPtg;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 报表操作
 */
@RestController
@RequestMapping("/report")
public class ReportController {
    @Reference
    private MemberService memberService;
    @Reference
    private SetmealService setmealService;
    @Reference
    private ReportService reportService;

    //会员数量柱状数据
    @RequestMapping("/getMemberReport")
    public Result getMemberReport() throws ParseException {

        //创建一个集合,把查到的数据放入集合中
        ArrayList<Integer> list = new ArrayList<>();

        Integer numOne = memberService.findMemberCountByOne();
        Integer numTwo = memberService.findMemberCountByTwo();
        Integer numThr = memberService.findMemberCountByThr();
        Integer numFou = memberService.findMemberCountByFou();
        Integer numFiv = memberService.findMemberCountByFiv();
        Integer numSix = memberService.findMemberCountBySix();
        //把查到的所有值添加到集合中
        Collections.addAll(list, numOne, numTwo, numThr, numFou, numFiv, numSix);


        return new Result(true, MessageConstant.GET_MEMBER_NUMBER_REPORT_SUCCESS, list);
    }

    //每日预约、到诊数量统计
    @RequestMapping("/getMemberLine")
    public Result getMemberLine(@RequestBody String value) throws ParseException {

        Map map = reportService.OrderAndDiagnosis(value);
        return new Result(true,MessageConstant.DELETE_CHECKGROUP_FAIL,map);

    }

    //体检收入统计
    @RequestMapping("/getMoney")
    public Result getMoney(@RequestBody String value1) throws ParseException {
        //创建一个map集合
        Map<String, Integer> map1 = new HashMap<>();
        Map<String, Integer> map2 = new HashMap<>();
        //前台来的数据"[2020-08-31T16:00:00.000Z,2020-10-02T16:00:00.000Z]";
        String UTCString = value1;
        //第一个日期
        String one = UTCString.substring(2, 25);
        //第二个日期
        String two = UTCString.substring(29, 51);
        //2020-08-31
        String oneDate = UTCStringtODefaultString(one);
        //2020-10-02
        String twoDate = UTCStringtODefaultString(two);
        //list 4,3,5,3,8,5

        ArrayList<GetMoneyReport> list = reportService.getMoney(oneDate, twoDate);
        /*GetMoneyReport{name='入职无忧体检套餐（男女通用）', amount=4, price=300.0}
     GetMoneyReport{name='孕前检查套餐（女）-精英版', amount=3, price=1500.0}
    GetMoneyReport{name='珍爱高端升级肿瘤12项筛查（男女单人）', amount=3, price=2400.0}
    GetMoneyReport{name='粉红珍爱(女)升级TM12项筛查体检套餐', amount=8, price=1200.0}
    GetMoneyReport{name='阳光爸妈升级肿瘤12项筛查（男女单人）体检套餐', amount=5, price=1400.0}*/
        if (list!=null){
            //集合不为空时再进行操作
            //获取对象里的价格,
            GetMoneyReport quanbu=new GetMoneyReport();
            float number=0;
            for (GetMoneyReport getMoneyReport : list) {
                float value = getMoneyReport.getValue();
                number= number+value;

            }

            quanbu.setName("总收入");
            quanbu.setValue(number);
            list.add(quanbu);

            return new Result(false,MessageConstant.ADD_CHECKGROUP_FAIL,list);

        }return new Result(false,MessageConstant.ADD_CHECKGROUP_FAIL);



       /* if (list != null) {
                //查询到的list不为空时候 在操作


                Integer integer1 = list.get(0) * 300;
                Integer integer2 = list.get(1) * 1500;
            Integer integer3 = list.get(2) * 2400;
            Integer integer4 = list.get(3) * 1200;
            Integer integer5 = list.get(4) * 1400;
            Integer integer6 = integer1 + integer2 + integer3 + integer4 + integer5;


            //遍历集合查看
            for (Integer integer : list) {
                System.out.println(integer);
            }

            //创建一个集合,集合里面放5个map对象

            ArrayList<Report> list1 = new ArrayList<>();
            //封装一个report对象
            Report report1 = new Report();
            report1.setName("入职无忧体检套餐（男女通用）");
            report1.setValue(integer1);

            Report report2 = new Report();
            report2.setName("孕前检查套餐（女）-精英版");
            report2.setValue(integer2);

            Report report3 = new Report();
            report3.setName("珍爱高端升级肿瘤12项筛查（男女单人）");
            report3.setValue(integer3);

            Report report4 = new Report();
            report4.setName("粉红珍爱(女)升级TM12项筛查体检套餐");
            report4.setValue(integer4);

            Report report5 = new Report();
            report5.setName("阳光爸妈升级肿瘤12项筛查（男女单人）体检套餐");
            report5.setValue(integer5);

            Report report6 = new Report();
            report6.setName("总收入");
            report6.setValue(integer6);

            list1.add(report1);
            list1.add(report2);
            list1.add(report3);
            list1.add(report4);
            list1.add(report5);
            list1.add(report6);


            map1.put("入职无忧体检套餐（男女通用）", integer1);
            map1.put("孕前检查套餐（女）-精英版", integer2);
            map1.put("珍爱高端升级肿瘤12项筛查（男女单人）", integer3);
            map1.put("粉红珍爱(女)升级TM12项筛查体检套餐", integer4);
            map1.put("阳光爸妈升级肿瘤12项筛查（男女单人）体检套餐", integer5);
            map1.put("总收入", integer6);
            return new Result(true, MessageConstant.ADD_CHECKGROUP_SUCCESS, list1);
        } else {
            return null;
        }
*/

    }

    //套餐预约占比饼形图
    @RequestMapping("/getSetmealReport")
    public Result getSetmealReport() {
        //使用模拟数据测试使用什么样的java对象转为饼形图所需的json数据格式
        Map<String, Object> data = new HashMap<>();

        /*List<String> setmealNames = new ArrayList<>();
        setmealNames.add("体检套餐");
        setmealNames.add("孕前检查套餐");
        data.put("setmealNames",setmealNames);*/
        try {
            List<Map<String, Object>> setmealCount = setmealService.findSetmealCount();
            data.put("setmealCount", setmealCount);

            List<String> setmealNames = new ArrayList<>();
            for (Map<String, Object> map : setmealCount) {
                String name = (String) map.get("name");//套餐名称
                setmealNames.add(name);
            }

            data.put("setmealNames", setmealNames);
            return new Result(true, MessageConstant.GET_SETMEAL_COUNT_REPORT_SUCCESS, data);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.GET_SETMEAL_COUNT_REPORT_FAIL);
        }
    }

    //运营数据统计
    @RequestMapping("/getBusinessReportData")
    public Result getBusinessReportData() {
        try {
            Map<String, Object> data = reportService.getBusinessReportData();
            return new Result(true, MessageConstant.GET_BUSINESS_REPORT_SUCCESS, data);
        } catch (Exception e) {
            return new Result(false, MessageConstant.GET_BUSINESS_REPORT_FAIL);
        }
    }

    //导出运营数据
    @RequestMapping("/exportBusinessReport")
    public Result exportBusinessReport(HttpServletRequest request, HttpServletResponse response) {
        try {
            Map<String, Object> result = reportService.getBusinessReportData();
            //取出返回结果数据，准备将报表数据写入到Excel文件中
            String reportDate = (String) result.get("reportDate");
            Integer todayNewMember = (Integer) result.get("todayNewMember");
            Integer totalMember = (Integer) result.get("totalMember");
            Integer thisWeekNewMember = (Integer) result.get("thisWeekNewMember");
            Integer thisMonthNewMember = (Integer) result.get("thisMonthNewMember");
            Integer todayOrderNumber = (Integer) result.get("todayOrderNumber");
            Integer thisWeekOrderNumber = (Integer) result.get("thisWeekOrderNumber");
            Integer thisMonthOrderNumber = (Integer) result.get("thisMonthOrderNumber");
            Integer todayVisitsNumber = (Integer) result.get("todayVisitsNumber");
            Integer thisWeekVisitsNumber = (Integer) result.get("thisWeekVisitsNumber");
            Integer thisMonthVisitsNumber = (Integer) result.get("thisMonthVisitsNumber");
            List<Map> hotSetmeal = (List<Map>) result.get("hotSetmeal");

            String filePath = request.getSession().getServletContext().getRealPath("template") + File.separator + "report_template.xlsx";
            //基于提供的Excel模板文件在内存中创建一个Excel表格对象
            XSSFWorkbook excel = new XSSFWorkbook(new FileInputStream(new File(filePath)));
            //读取第一个工作表
            XSSFSheet sheet = excel.getSheetAt(0);

            XSSFRow row = sheet.getRow(2);
            row.getCell(5).setCellValue(reportDate);//日期

            row = sheet.getRow(4);
            row.getCell(5).setCellValue(todayNewMember);//新增会员数（本日）
            row.getCell(7).setCellValue(totalMember);//总会员数

            row = sheet.getRow(5);
            row.getCell(5).setCellValue(thisWeekNewMember);//本周新增会员数
            row.getCell(7).setCellValue(thisMonthNewMember);//本月新增会员数

            row = sheet.getRow(7);
            row.getCell(5).setCellValue(todayOrderNumber);//今日预约数
            row.getCell(7).setCellValue(todayVisitsNumber);//今日到诊数

            row = sheet.getRow(8);
            row.getCell(5).setCellValue(thisWeekOrderNumber);//本周预约数
            row.getCell(7).setCellValue(thisWeekVisitsNumber);//本周到诊数

            row = sheet.getRow(9);
            row.getCell(5).setCellValue(thisMonthOrderNumber);//本月预约数
            row.getCell(7).setCellValue(thisMonthVisitsNumber);//本月到诊数

            int rowNum = 12;
            for (Map map : hotSetmeal) {//热门套餐
                String name = (String) map.get("name");
                Long setmeal_count = (Long) map.get("setmeal_count");
                BigDecimal proportion = (BigDecimal) map.get("proportion");
                row = sheet.getRow(rowNum++);
                row.getCell(4).setCellValue(name);//套餐名称
                row.getCell(5).setCellValue(setmeal_count);//预约数量
                row.getCell(6).setCellValue(proportion.doubleValue());//占比
            }

            //使用输出流进行表格下载,基于浏览器作为客户端下载
            OutputStream out = response.getOutputStream();
            response.setContentType("application/vnd.ms-excel");//代表的是Excel文件类型
            response.setHeader("content-Disposition", "attachment;filename=report.xlsx");//指定以附件形式进行下载
            excel.write(out);

            out.flush();
            out.close();
            excel.close();
            return null;
        } catch (Exception e) {
            return new Result(false, MessageConstant.GET_BUSINESS_REPORT_FAIL);
        }
    }

    public static int calcDayOffset(Date date1, Date date2) {
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(date1);

        Calendar cal2 = Calendar.getInstance();
        cal2.setTime(date2);
        int day1 = cal1.get(Calendar.DAY_OF_YEAR);
        int day2 = cal2.get(Calendar.DAY_OF_YEAR);

        int year1 = cal1.get(Calendar.YEAR);
        int year2 = cal2.get(Calendar.YEAR);
        if (year1 != year2) {  //同一年
            int timeDistance = 0;
            for (int i = year1; i < year2; i++) {
                if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {  //闰年
                    timeDistance += 366;
                } else {  //不是闰年

                    timeDistance += 365;
                }
            }
            return timeDistance + (day2 - day1);
        } else { //不同年
            return day2 - day1;
        }
    }

    public static String UTCStringtODefaultString(String UTCString) {
        try {
            if (true) {
                UTCString = UTCString.replace("Z", " UTC");
                SimpleDateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat defaultFormat = new SimpleDateFormat("yyyy-MM-dd");
                Date date = utcFormat.parse(UTCString);
                return defaultFormat.format(date);
            } else {
                return null;
            }

        } catch (ParseException pe) {
            pe.printStackTrace();
            return null;
        }
    }
}
